package cn.agiledata.bank.linkbank.service;

import cn.agiledata.bank.linkbank.exception.LinkBankException;
import cn.agiledata.bank.linkbank.logic.payment.BankTelPayRequest;
import cn.agiledata.bank.linkbank.logic.payment.BankTelPayRequestFeekback;
import cn.agiledata.bank.linkbank.logic.payment.UnsPayRequest;

public interface BankTelPayService extends BankPayService {
    public static final String EXPIRE_DAYS_KEY = "TEL_PAY_EXPIRE_DAYS";

    /**
     * 判断指定银行代码是否有效，且系统支持对应银行的电话银行
     * 
     * @param bankCode
     *            银行代码
     * @return true if 指定银行代码有效，且系统支持对应银行的电话银行, otherwise false
     */
    public boolean validTelBankCode(String bankCode);

    /**
     * 根据支付系统请求和已保存交易的交易编号获取银行电话支付请求
     * 
     * @param unsPayRequest
     *            商户到支付系统的支付请求
     * @param transId
     *            交易编号，给电话银行的订单号
     * @param orderTelephone
     *            订单预留电话
     * @param webRootUrl
     *            web根url
     * @return 银行电话支付请求
     * @throws LinkBankException
     */
    public BankTelPayRequest getBankTelPayRequest(UnsPayRequest unsPayRequest,
            String transId, String orderTelephone, String webRootUrl)
            throws LinkBankException;

    /**
     * 从后台发送电话银行支付请求，获取即时反馈
     * 
     * @param bankCode
     *            银行代码
     * @param bankTelPayRequest
     *            电话银行支付请求
     * @return 电话银行支付请求即时反馈
     * @throws LinkBankException
     */
    public BankTelPayRequestFeekback sendBankTelPayRequest(String bankCode,
            BankTelPayRequest bankTelPayRequest) throws LinkBankException;

    /**
     * 校验指定订单预留电话是否合法有效
     * 
     * @param orderTelephone
     *            订单预留电话
     * @throws LinkBankException
     *             如果校验失败
     */
    public void validateOrderTelephone(String orderTelephone)
            throws LinkBankException;

}